/*---------------------
* @ 作者:traveler
* @ 版本:(1.0 beta)
* @ 日期: 2021-05-10 22:16
* @ 功能描述:事件管理
*						
------------------------*/

export class NetDispatcher {
    public static eventDispatcher: Laya.EventDispatcher;

    public static get disEvent(): Laya.EventDispatcher {
        if (!NetDispatcher.eventDispatcher)
        NetDispatcher.eventDispatcher = new Laya.EventDispatcher();
        return NetDispatcher.eventDispatcher;
    }
    /**
     * 派发事件。
     * @param eventName 事件类型。
     * @param params （可选）回调数据。<b>注意：</b>如果是需要传递多个参数 p1,p2,p3,...可以使用数组结构如：[p1,p2,p3,...] ；如果需要回调单个参数 p ，且 p 是一个数组，则需要使用结构如：[p]，其他的单个参数 p ，可以直接传入参数 p。
     * @return 此事件类型是否有侦听者，如果有侦听者则值为 true，否则值为 false。
     */
    public static dispatch(eventName: string | number, params: any = null): void {
        NetDispatcher.disEvent.event(eventName+ "", params);
    }

    /**
    * 使用 EventDispatcher 对象注册指定类型的事件侦听器对象，以使侦听器能够接收事件通知。
    * @param eventName 事件的类型。
    * @param caller 事件侦听函数的执行域。
    * @param callback 事件侦听函数。
    * @param args （可选）事件侦听函数的回调参数。
    * @return 此 EventDispatcher 对象。
    */
    public static addListener(eventName: string | number, caller: any, callback: Function, onceOnly?: boolean): void {
        if (onceOnly)
        NetDispatcher.disEvent.once(eventName + "", caller, callback);
        else
        NetDispatcher.disEvent.on(eventName + "", caller, callback);
    }

    /**
     * 从 EventDispatcher 对象中删除侦听器。
     * @param type 事件的类型。
     * @param caller 事件侦听函数的执行域。
     * @param callback 事件侦听函数。
     * @param onceOnly （可选）如果值为 true ,则只移除通过 once 方法添加的侦听器。
     * @return 此 EventDispatcher 对象。
     */
    public static removeListener(eventName: string | number, caller: any, callback: Function, onceOnly?: boolean): void {

        NetDispatcher.disEvent.off(eventName+ "", caller, callback, onceOnly);

    }

    /**
     * 从 EventDispatcher 对象中删除指定事件类型的所有侦听器。
     * @param eventName （可选）事件类型，如果值为 null，则移除本对象所有类型的侦听器。
     * @return 此 EventDispatcher 对象。
     */
    public static removeListenerAllByName(eventName: string): void {
        NetDispatcher.eventDispatcher.offAll(eventName);
    }
    /**
     * 移除caller为target的所有事件监听
     * @param caller caller对象
     */
    public static removeListenerAllByCaller(caller: any): void {
        NetDispatcher.eventDispatcher.offAll(caller);
    }


}
